iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0
Modern Web

用 Node.js 打造後端 API系列 第 17

Day 17 - 忘記密碼1

  • 分享至 

  • xImage
  •  

重設密碼


不知道大家有沒有遇過以下這種情況:
先前在某個網站上註冊會員,過了一陣子後要去登入時
發現自己居然記不得密碼了!?
沒關係!現在幾乎每個網站都能讓你reset password
就算你再健忘都不怕,忘記密碼再重設密碼就好了
今天就要來實作重設密碼的功能

流程


使用者要重設密碼的流程,大致上是這樣:

  • 忘記密碼
  • 後台產生一組token
  • 使用者收到含有token的url (透過email)
  • 使用者make PUT request到這組url來更改密碼
    今天要實作的功能為產生token, 後兩者留到明天完成

產生token


在'./models/User'建立method
需要使用到crypto module
首先要建立&加密token
再將token存到user.resetPasswordToken這個type中
同時設定token再10分鐘後到期
最後回傳未加密過的token

UserSchema.methods.getResetPasswordToken = function() {
  const resetToken = crypto.randomBytes(20).toString('hex');

  this.resetPasswordToken = crypto
    .createHash('sha256')
    .update(resetToken)
    .digest('hex');

  this.resetPasswordExpire = Date.now() + 10 * 60 * 1000;

  return resetToken;
}

接著到'./controllers/auth'建立forgotPassword函式
透過剛剛寫的method, 將未加密過的token存在resetToken
同時儲存剛剛設定的resetPasswordToken&resetPasswordToken type

exports.forgotPassword = asyncHandler(async (req, res, next) => {
  const user = await User.findOne({ email: req.body.email });

  if (!user) {
    return next(
      new ErrorResponse('There is no user with that email', 404)
    );
  }
  
  const resetToken = user.getResetPasswordToken();

  await user.save({ validateBeforeSave: false });

  res.status(200).json({
    success: true,
    data: user
  });
});

明天會用到Mailtrap API與Nodemailer
各位可以先去看看官方的doc預習一下~


上一篇
Day 16 - 管理Bootcamp&Course的所有權
下一篇
Day 18 - 忘記密碼2
系列文
用 Node.js 打造後端 API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言